package com.cty._06_TwoExamples._67_StringToInt;

/**
 * @Auther: cty
 * @Date: 2020/7/26 9:06
 * @Description: 面试题67：把字符串转换成整数
 * 题目：请你写一个函数StrToInt，实现把字符串转换成整数这个功能。当然，不
 * 能使用atoi或者其他类似的库函数。
 * @version: 1.0
 */
public class StringToInt {

    public static boolean isReturnValid;

    // 肯定——>否定 思路实现
    public static int stringToInt(String str){
        isReturnValid = true;
        // 1 有效值处理
        if(str==null || str.equals("")){
            isReturnValid = false;
            return 0;
        }

        char[] chars = str.toCharArray();
        int strLen = chars.length;

        // 2 只有一个字符情况处理
        if(strLen == 1){
            if(chars[0]<'0' || chars[0]>'9'){
                isReturnValid = false;
                return 0;
            }else
                return chars[0] - '0';
        }  // end if

        // 3 有多个字符，首字符处理
        boolean isNegative = false;
        long num = 0;
        if(chars[0] == '-')
            isNegative = true;
        else if(chars[0] == '+')
            ;
        else if(chars[0]>='0' && chars[0]<='9')
            num = chars[0] - '0';
        else {
            isReturnValid = false;
            return 0;
        }
        // 4 后面字符处理
        for(int i=1; i<strLen; i++){
            if(chars[i]<'0' || chars[i]>'9'){
                isReturnValid = false;
                return 0;
            }
            num = num*10 + (chars[i]-'0');

            if((isNegative && -1*num<Integer.MIN_VALUE) || (!isNegative && num>Integer.MAX_VALUE)) {  // 溢出处理
                isReturnValid = false;
                return 0;
            }
        }  // end for

        return (int)(isNegative?-1*num:num);
    }  // end stringToInt()


    // 否定 -> 肯定 实现
    public static int stringToInt2(String str){
        isReturnValid = false;
        long num = 0;

        if(str!=null && !str.equals("")){  // 无效值处理
            char[] chars = str.toCharArray();
            int strLen = chars.length;
            int i = 0;
            boolean isNegative = false;

            // 首字符处理
            if(chars[0] == '-') {
                isNegative = true;
                i++;
            } else if (chars[0] == '+')
                i++;
            if(i==1 && strLen==1)  // 只有一个+或-字符
                return (int)num;
            // 后面的字符处理
            for(; i<strLen; i++){
                if(chars[i]>='0' && chars[i]<='9'){  // 出现不合法字符
                    num = num*10 + (chars[i]-'0');

                    if((isNegative && -1*num<Integer.MIN_VALUE) || (!isNegative && num>Integer.MAX_VALUE)) {  // 溢出处理
                        num = 0;
                        break;
                    }
                }else {
                    num = 0;
                    break;
                }
            }  // end for

            if(i == str.length()) {
                isReturnValid = true;
                return (int)(isNegative?-1*num:num);
            }
        }  // end if

        return (int)num;
    }  // end stringToInt2()

}  // end class
